#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=1e6+10;
int T,n,m,L,V,pos[N],dif[M];
struct node{int d,v0,a;}cr[N];
bool lmt_spd(int t){
    if(cr[t].a<0){
        int idx=lower_bound(pos+1,pos+1+m,cr[t].d)-pos;
        int dtx=pos[idx]-cr[t].d;
        if(int(cr[t].v0*cr[t].v0/(-2*cr[t].a))<dtx) return true;
        int vt=ceil(sqrt((cr[t].v0*cr[t].v0+2*cr[t].a*dtx)));
        if(vt<=V) return true;
        else return false;
    }
    else if(cr[t].a==0){
        if(cr[t].d>pos[m]||cr[t].v0<=V) return true;
        else return false;
    }
    else{
        if(cr[t].d>pos[m]) return true;
        else if(cr[t].d==pos[m]){
            if(cr[t].v0<=V) return true;
            else return false;
        }
        else{
            int dtx=pos[m]-cr[t].d;
            int vt=ceil(sqrt((cr[t].v0*cr[t].v0+2*cr[t].a*dtx)));
            if(vt<=V) return true;
            else return false;
        }
    }
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>T;
    while(T--){
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;i++) cin>>cr[i].d>>cr[i].v0>>cr[i].a;
        for(int i=1;i<=m;i++) cin>>pos[i];
        int cntc=0;
        for(int i=1;i<=n;i++){
            if(!lmt_spd(i)) cntc++;
        }
        cout<<cntc<<' ';
        if(cntc==0) cout<<m<<'\n';
        else cout<<m-1<<'\n';
    }
    return 0;
}
